home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / ifcico / respfreq.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-09  |  5.0 KB  |  270 lines

  1. #include <unistd.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #ifdef HAS_REGEX_H
  9. #include <regex.h>
  10. #else
  11. char *re_comp(char*);
  12. int re_exec(char*);
  13. #endif
  14. #include <dirent.h>
  15. #include "session.h"
  16. #include "xutil.h"
  17. #include "lutil.h"
  18. #include "config.h"
  19.  
  20. #ifndef S_ISDIR
  21. #define S_ISDIR(st_mode)       (((st_mode) & S_IFMT) == S_IFDIR)
  22. #endif
  23. #ifndef S_ISREG
  24. #define S_ISREG(st_mode)       (((st_mode) & S_IFMT) == S_IFREG)
  25. #endif
  26.  
  27. #define KFS 2
  28.  
  29. extern char *freqname;
  30. extern char *logname;
  31. extern int execsh(char*,char*,char*,char*);
  32. extern unsigned long atoul(char*);
  33.  
  34. static file_list *respfreq(char*,char*,char*);
  35. static file_list *respmagic(char*);
  36.  
  37. file_list *respond_wazoo(char*);
  38. file_list *respond_wazoo(fn)
  39. char *fn;
  40. {
  41.     char buf[256];
  42.     char *nm,*pw,*dt,*p;
  43.     file_list *fl=NULL,**tmpl;
  44.     FILE *fp;
  45.  
  46.     if (freqname == NULL) return NULL;
  47.  
  48.     if ((fp=fopen(freqname,"r")) == NULL)
  49.     {
  50.         logerr("$cannot open received wazoo freq \"%s\"",freqname);
  51.         unlink(freqname);
  52.         free(freqname);
  53.         freqname=NULL;
  54.         return NULL;
  55.     }
  56.  
  57.     tmpl=&fl;
  58.     while (fgets(buf,sizeof(buf)-1,fp))
  59.     {
  60.         nm=NULL;
  61.         pw=NULL;
  62.         dt=NULL;
  63.         p=strtok(buf," \n\r");
  64.         if ((p == NULL) || (*p == '\0')) continue;
  65.         nm=p;
  66.         p=strtok(NULL," \n\r");
  67.         if (p && (*p == '!')) pw=p+1;
  68.         else if (p && ((*p == '+') || (*p == '-'))) dt=p;
  69.         p=strtok(NULL," \n\r");
  70.         if (p && (*p == '!')) pw=p+1;
  71.         else if (p && ((*p == '+') || (*p == '-'))) dt=p;
  72.         *tmpl=respfreq(nm,pw,dt);
  73.         while (*tmpl) tmpl=&((*tmpl)->next);
  74.     }
  75.  
  76.     fclose(fp);
  77.     unlink(freqname);
  78.     free(freqname);
  79.     freqname=NULL;
  80.     for (tmpl=&fl;*tmpl;tmpl=&((*tmpl)->next))
  81.     {
  82.         debug(12,"resplist: %s",(*tmpl)->local);
  83.     }
  84.     return fl;
  85. }
  86.  
  87. file_list *respond_bark(char*);
  88. file_list *respond_bark(buf)
  89. char *buf;
  90. {
  91.     char *nm,*pw,*dt,*p;
  92.  
  93.     nm=buf;
  94.     pw="";
  95.     dt="0";
  96.     while (isspace(*nm)) nm++;
  97.     for (p=nm;*p && (!isspace(*p));p++);
  98.     if (*p)
  99.     {
  100.         *p++='\0';
  101.         dt=p;
  102.         while (isspace(*dt)) dt++;
  103.         for (p=dt;*p && (!isspace(*p));p++);
  104.         if (*p)
  105.         {
  106.             *p++='\0';
  107.             pw=p;
  108.             while (isspace(*pw)) pw++;
  109.             for (p=pw;*p && (!isspace(*p));p++);
  110.             *p='\0';
  111.         }
  112.     }
  113.     return respfreq(nm,pw,dt);
  114. }
  115.  
  116. file_list *respfreq(nm,pw,dt)
  117. char *nm,*pw,*dt;
  118. {
  119.     file_list *fl=NULL,**tfl;
  120.     DIR *dp;
  121.     struct dirent *de;
  122.     struct stat st;
  123.     char mask[256],*p,*q;
  124.     char *tnm,*tdir;
  125.     time_t upd=0L;
  126.     int newer=1,pass;
  127.  
  128.     loginf("remote requested \"%s\" (update %s, password \"%s\")",nm,dt,pw);
  129.  
  130.     tfl=&fl;
  131.  
  132.     if (dt)
  133.     {
  134.         if (*dt == '+')
  135.         {
  136.             newer=1;
  137.             dt++;
  138.         }
  139.         else if (*dt == '-')
  140.         {
  141.             newer=0;
  142.             dt++;
  143.         }
  144.         else newer=1;
  145.         upd=atoul(dt);
  146.     }
  147.     tnm=xstrcpy(magic);
  148.     tnm=xstrcat(tnm,"/");
  149.     tnm=xstrcat(tnm,nm);
  150.     if ((stat(tnm,&st) == 0) &&
  151.         (S_ISREG(st.st_mode)) &&
  152.         (access(tnm,X_OK) == 0))
  153.     {
  154.         return respmagic(tnm); /* respmagic will free(tnm) */
  155.     }
  156.     else free(tnm);
  157.  
  158.     tdir=xstrcpy(public);
  159.     if ((p=strrchr(nm,'/')))
  160.     {
  161.         *p++='\0';
  162.         tdir=xstrcat(tdir,"/");
  163.         tdir=xstrcat(tdir,nm);
  164.     }
  165.     else
  166.         p=nm;
  167.  
  168.     q=mask;
  169.     while ((*p) && (q < (mask+sizeof(mask)-4)))
  170.     {
  171.         switch (*p)
  172.         {
  173.         case '\\':    *q++='\\'; *q++='\\'; break;
  174.         case '?':    *q++='.'; break;
  175.         case '.':    *q++='\\'; *q++='.'; break;
  176.         case '*':    *q++='.'; *q++='*'; break;
  177.         default:    *q++=*p; break;
  178.         }
  179.         p++;
  180.     }
  181.     *q++='$';
  182.     *q='\0';
  183.  
  184.     if ((dp=opendir(tdir)) == NULL)
  185.     {
  186.         logerr("$cannot opendir \"%s\"",public);
  187.         free(tdir);
  188.         return NULL;
  189.     }
  190.  
  191.     for (pass=0;(pass < 2) && (fl == NULL);pass++)
  192.     {
  193.         if (pass > 0)
  194.         {
  195.             for (p=mask;*p;p++) *p=tolower(*p);
  196.             rewinddir(dp);
  197.         }
  198.         debug(12,"try search mask: \"%s\"",mask);
  199.         re_comp(mask);
  200.  
  201.         while ((de=readdir(dp))) if (re_exec(de->d_name))
  202.         {
  203.             debug(12,"matching file \"%s\"",de->d_name);
  204.             tnm=xstrcpy(public);
  205.             tnm=xstrcat(tnm,"/");
  206.             tnm=xstrcat(tnm,de->d_name);
  207.  
  208.             if ((stat(tnm,&st) == 0) &&
  209.                 (S_ISREG(st.st_mode)) &&
  210.                 (access(tnm,R_OK) == 0) &&
  211.                 ((upd == 0L) ||
  212.                  ((newer) && (st.st_mtime > upd)) ||
  213.                  ((!newer) && (st.st_mtime <= upd))))
  214.             {
  215.                 *tfl=(file_list *)xmalloc(sizeof(file_list));
  216.                 (*tfl)->next=NULL;
  217.                 (*tfl)->flofp=NULL;
  218.                 (*tfl)->floff=0L;
  219.                 (*tfl)->disposition=0;
  220.                 (*tfl)->local=tnm;
  221.                 (*tfl)->remote=xstrcpy(de->d_name);
  222.                 tfl=&((*tfl)->next);
  223.             }
  224.             else free(tnm);
  225.         }
  226.         
  227.     }
  228.  
  229.     free(tdir);
  230.     closedir(dp);
  231.     return fl;
  232. }
  233.  
  234. file_list *respmagic(cmd) /* must free(cmd) before exit */
  235. char *cmd;
  236. {
  237.     char cmdbuf[256];
  238.     char tmpfn[L_tmpnam];
  239.     char remname[32],*p;
  240.     file_list *fl=NULL;
  241.  
  242.     debug(12,"respond to \"magic\" file request \"%s\"",cmd);
  243.     (void)tmpnam(tmpfn);
  244.     if ((p=strrchr(cmd,'/'))) p++;
  245.     else p=cmd;
  246.     strncpy(remname,p,sizeof(remname)-1);
  247.     if (remote->addr->name == NULL) remote->addr->name=xstrcpy("Sysop");
  248.     sprintf(cmdbuf,"%s %s",
  249.         cmd,ascfnode(remote->addr,0x7f));
  250.     if (execsh(cmdbuf,"/dev/null",tmpfn,logname))
  251.     {
  252.         logerr("error executing magic file request");
  253.         unlink(tmpfn);
  254.     }
  255.     else
  256.     {
  257.         fl=(file_list *)xmalloc(sizeof(file_list));
  258.         fl->next=NULL;
  259.         fl->flofp=NULL;
  260.         fl->floff=0L;
  261.         fl->disposition=KFS;
  262.         fl->local=xstrcpy(tmpfn);
  263.         fl->remote=xstrcpy(remname);
  264.         debug(12,"magic resp list: \"%s\" -> \"%s\"",
  265.             fl->local,fl->remote);
  266.     }
  267.     free(cmd);
  268.     return fl;
  269. }
  270.